home *** CD-ROM | disk | FTP | other *** search
- ///--------------------------------------------------------------------------------------
- // ButtonBreakOut.c
- // a revised version of SimpleBreakOut.c
- //
- // Portions are Copyright © 1993 Tony Myles, All rights reserved worldwide.
- //
- // Description: This is a very basic breakout type game that demonstrates
- // SpriteWorld's efficient handling of inactive sprites.
- // It also shows how you can use ButtonSprites within your animation.
- ///--------------------------------------------------------------------------------------
- // Search for:
- //
- // button-related routines
- //
- // to see the complete demo interface to buttons.
-
- #include <stdio.h>
- #include <string.h>
-
- #include "SWIncludes.h" // Automatically include all SpriteWorld.h files
- #include "SWGameUtils.h"
-
- #include "SWApplication.h"
- #include "ButtonSprite.h"
- #include "ButtonBreakOut.h"
- #include "SpritePersistence.h"
- #include "DataPersistence.h"
-
- #define kMaxFPS 60 // Set to 0 for maximum speed
- #define kSyncToVBL true // Sync animation to VBL?
-
- #define kPlayPictID 1000
- #define kPlayWidth 85
- #define kQuitPictID 1001
- #define kQuitWidth 85
- #define kDisabledPictID 1002
- #define kDisabledWidth 160
- #define kPausePictID 1003 // [DB]
- #define kPauseWidth 72 // [DB]
- #define kGiveUpPictID 1004 // [DB]
- #define kGiveUpWidth 94 // [DB]
-
- enum
- {
- kBallHorizDelta = 5,
- kBallVertDelta = 5,
- kNumberOfBrickColumns = 10,
- kNumberOfBrickRows = 5,
- kTotalNumberOfBricks = (kNumberOfBrickColumns * kNumberOfBrickRows),
- kBrickCIconID = 129,
- kBreakBallCIconID = 130,
- kPaddleCIconID = 131,
- kEraseWritingTimer = 60,
- kEraseReadingTimer = 90
- };
-
- Point oldPoint, newPoint; // Mouse variables used for moving paddle
- OSErr err;
- PixPatHandle pixPatH;
-
- SpriteWorldPtr spriteWorldP;
- SpriteLayerPtr brickLayerP;
- SpriteLayerPtr ballLayerP;
- SpriteLayerPtr paddleLayerP;
- SpriteLayerPtr buttonsLayerP;
- SpritePtr brickSpriteArray[kTotalNumberOfBricks];
- SpritePtr ballSpriteP;
- SpritePtr paddleSpriteP;
- ButtonSpritePtr playButtonSpritePtr;
- ButtonSpritePtr quitButtonSpritePtr;
- ButtonSpritePtr disabledButtonSpritePtr;
- ButtonSpriteRec playButtonSpriteRec;
- ButtonSpriteRec quitButtonSpriteRec;
- ButtonSpriteRec disabledButtonSpriteRec;
-
- ButtonSpritePtr pauseButtonSpritePtr; // [DB]
- ButtonSpritePtr giveUpButtonSpritePtr; // [DB]
- ButtonSpriteRec pauseButtonSpriteRec; // [DB]
- ButtonSpriteRec giveUpButtonSpriteRec; // [DB]
-
- SInt16 horizOffset, vertOffset, brickHoriz, brickVert, col, row, n, QuitBreakOut, BrickNum;
- Boolean PauseBreakOut = false; // [DB]
- Boolean GiveUpBreakOut = false; // [DB]
- Rect moveBoundsRect;
- long PaddleWiggle; // during the demo this makes the paddle wiggle back and forth
-
- CursHandle FingerCursorHandle;
- CWindowPtr srcWindowP;
-
- Boolean cursorVisible; // [DB]
-
- UInt32 eraseTime = 0L; // [DB]
- UInt32 countSaves = 0L; // [DB]
- char demoStr [256] = {"<empty>"}; // [DB]
- SInt16 demoRez = 6666; // [DB]
- SInt16 colorRez = 1000;
-
-
- RGBColor infoTextColor; // [DB]
-
-
- ///--------------------------------------------------------------------------------------
- // main
- ///--------------------------------------------------------------------------------------
-
- void main(void)
- {
- Rect windRect;
-
-
- Initialize(kNumberOfMoreMastersCalls);
-
- if (!SWHasSystem7())
- CantRunOnThisMachine();
-
- SetCursor(*GetCursor(watchCursor));
-
- // Create and set up the window
- srcWindowP = (CWindowPtr) GetNewCWindow(kWindowResID, NULL, (WindowPtr)-1L);
-
- if (srcWindowP != NULL)
- {
- // Center window in screen
- windRect = srcWindowP->portRect;
- CenterRect(&windRect, &qd.screenBits.bounds);
- MoveWindow((WindowPtr) srcWindowP, windRect.left, windRect.top, false);
-
- ShowWindow((WindowPtr) srcWindowP);
- SetPort((WindowPtr) srcWindowP);
- }
- else
- CantFindResource();
-
-
- PerformSimpleAnimation();
- }
-
-
- ///--------------------------------------------------------------------------------------
- // PerformSimpleAnimation
- ///--------------------------------------------------------------------------------------
-
- void PerformSimpleAnimation(void)
- {
- EventRecord event;
-
- SetPort((GrafPtr)srcWindowP);
-
- //
- // STEP #1: initialize the sprite world package
- //
-
- err = SWEnterSpriteWorld();
- FatalError(err);
-
-
- //
- // STEP #2: create the various pieces that we need
- //
-
- // create the sprite world
- err = SWCreateSpriteWorldFromWindow(&spriteWorldP, srcWindowP, NULL, NULL, 0);
- FatalError(err);
-
- // create the brick layer
- err = SWCreateSpriteLayer(&brickLayerP);
- FatalError(err);
-
- // create the ball layer
- err = SWCreateSpriteLayer(&ballLayerP);
- FatalError(err);
-
- // create the paddle layer
- err = SWCreateSpriteLayer(&paddleLayerP);
- FatalError(err);
-
- // create the buttons layer
- err = SWCreateSpriteLayer(&buttonsLayerP);
- FatalError(err);
-
- // Create the first brick sprite
- err = SWCreateSpriteFromCicnResource(spriteWorldP, &(brickSpriteArray[0]), NULL,
- kBrickCIconID, 1, kNoMask);
-
- // Clone the other brick sprites off the first one
- for (BrickNum = 1; BrickNum < kTotalNumberOfBricks; BrickNum++)
- {
- err = SWCloneSprite(brickSpriteArray[0], &brickSpriteArray[BrickNum], NULL);
- FatalError(err);
- }
-
- // create ball sprite
- err = SWCreateSpriteFromCicnResource(spriteWorldP, &ballSpriteP, NULL,
- kBreakBallCIconID, 1, kFatMask);
- FatalError(err);
-
- // create paddle sprite
- err = SWCreateSpriteFromCicnResource(spriteWorldP, &paddleSpriteP, NULL,
- kPaddleCIconID, 1, kFatMask);
- FatalError(err);
-
- // create play button sprite
- err = SWCreateSpriteFromSinglePict(spriteWorldP, &(SpritePtr)playButtonSpritePtr, (SpritePtr)&playButtonSpriteRec,
- kPlayPictID, kPlayPictID, kPlayWidth,1, kFatMask);
- FatalError(err);
-
- err = SWCreateSpriteFromSinglePict(spriteWorldP, &(SpritePtr)quitButtonSpritePtr, (SpritePtr)&quitButtonSpriteRec,
- kQuitPictID, kQuitPictID, kQuitWidth,1, kFatMask);
- FatalError(err);
-
- err = SWCreateSpriteFromSinglePict(spriteWorldP, &(SpritePtr)disabledButtonSpritePtr, (SpritePtr)&disabledButtonSpriteRec,
- kDisabledPictID, kDisabledPictID, kDisabledWidth,1, kFatMask);
- FatalError(err);
-
- err = SWCreateSpriteFromSinglePict(spriteWorldP, &(SpritePtr)pauseButtonSpritePtr, (SpritePtr)&pauseButtonSpriteRec,
- kPausePictID, kPausePictID, kPauseWidth,1, kFatMask); // [DB]
- FatalError(err);
-
- err = SWCreateSpriteFromSinglePict(spriteWorldP, &(SpritePtr)giveUpButtonSpritePtr, (SpritePtr)&giveUpButtonSpriteRec,
- kGiveUpPictID, kGiveUpPictID, kGiveUpWidth,1, kFatMask); // [DB]
- FatalError(err);
-
-
-
- //
- // STEP #3: put the pieces together (must be done BEFORE the sprite world is locked!)
- //
-
- for (BrickNum = 0; BrickNum < kTotalNumberOfBricks; BrickNum++)
- {
- // add the brick sprite to the brick layer
- SWAddSprite(brickLayerP, brickSpriteArray[BrickNum]);
- }
-
- // add the ball sprite to the ball layer
- SWAddSprite(ballLayerP, ballSpriteP);
-
- // add the paddle sprite to the paddle layer
- SWAddSprite(paddleLayerP, paddleSpriteP);
-
- // add the button sprites to the button layer
- SWAddSprite(buttonsLayerP, (SpritePtr) playButtonSpritePtr);
- SWAddSprite(buttonsLayerP, (SpritePtr) quitButtonSpritePtr);
- SWAddSprite(buttonsLayerP, (SpritePtr) disabledButtonSpritePtr);
- SWAddSprite(buttonsLayerP, (SpritePtr) pauseButtonSpritePtr); // [DB]
- SWAddSprite(buttonsLayerP, (SpritePtr) giveUpButtonSpritePtr); // [DB]
-
- //
- // STEP #4: set things up for the animation
- // (can be done before or after locking the SpriteWorld)
- //
-
- // calculate the movement boundary rectangle
- moveBoundsRect = srcWindowP->portRect;
-
- horizOffset = (brickSpriteArray[0]->curFrameP->frameRect.right - brickSpriteArray[0]->curFrameP->frameRect.left) + 2;
- vertOffset = (brickSpriteArray[0]->curFrameP->frameRect.bottom - brickSpriteArray[0]->curFrameP->frameRect.top) + 2;
- brickHoriz = 2;
- brickVert = (vertOffset * 2);
- BrickNum = 0;
-
- // set up the bricks
- for (col = 0; col < kNumberOfBrickColumns; col++)
- {
- brickVert = (vertOffset * 2);
-
- for (row = 0; row < kNumberOfBrickRows; row++)
- {
- // set the sprite’s initial location
- SWSetSpriteLocation(brickSpriteArray[BrickNum], brickHoriz, brickVert);
- SWSetSpriteMoveTime(brickSpriteArray[BrickNum], -1);
-
- BrickNum++;
- brickVert += vertOffset;
- }
-
- brickHoriz += horizOffset;
- }
-
- // set the buttons location
- SWSetSpriteLocation((SpritePtr) playButtonSpritePtr, 100, 175);
- SWSetSpriteLocation((SpritePtr) quitButtonSpritePtr, 100, 225);
- SWSetSpriteLocation((SpritePtr) disabledButtonSpritePtr, 100, 275);
- SWSetSpriteLocation((SpritePtr) pauseButtonSpritePtr, 30, 350); // [DB]
- SWSetSpriteLocation((SpritePtr) giveUpButtonSpritePtr, 220, 350); // [DB]
-
- // set the buttons callbacks
- SWGSetUpButtonCallbacks (playButtonSpritePtr, GenericDrawButtonUpProc, GenericDrawButtonMouseOverProc,
- GenericDrawButtonDownProc, GenericDrawButtonDisabledProc, PlayProc);
-
- SWGSetUpButtonCallbacks (quitButtonSpritePtr, GenericDrawButtonUpProc, GenericDrawButtonMouseOverProc,
- GenericDrawButtonDownProc, GenericDrawButtonDisabledProc, QuitProc);
-
- SWGSetUpButtonCallbacks (disabledButtonSpritePtr, GenericDrawButtonUpProc, GenericDrawButtonMouseOverProc,
- GenericDrawButtonDownProc, GenericDrawButtonDisabledProc, nil);
-
- SWGSetUpButtonCallbacks (pauseButtonSpritePtr, GenericDrawButtonUpProc, GenericDrawButtonMouseOverProc,
- GenericDrawButtonDownProc, GenericDrawButtonDisabledProc, PauseProc); // [DB]
-
- SWGSetUpButtonCallbacks (giveUpButtonSpritePtr, GenericDrawButtonUpProc, GenericDrawButtonMouseOverProc,
- GenericDrawButtonDownProc, GenericDrawButtonDisabledProc, GiveUpProc); // [DB]
-
-
- // set the ball’s movement characteristics
- SWSetSpriteLocation(ballSpriteP, - 100, 50);
- SWSetSpriteMoveBounds(ballSpriteP, &moveBoundsRect);
- SWSetSpriteMoveDelta(ballSpriteP, kBallHorizDelta, kBallVertDelta);
- SWSetSpriteMoveProc(ballSpriteP, BallMoveProc);
- SWSetSpriteCollideProc(ballSpriteP, BallCollideProc);
-
- // set the paddle’s movement characteristics
- SWSetSpriteMoveBounds(paddleSpriteP, &moveBoundsRect);
- SetUpPaddle(paddleSpriteP);
- SWSetSpriteMoveProc(paddleSpriteP, PaddleMoveProc);
- SWSetSpriteCollideProc(paddleSpriteP, PaddleCollideProc);
-
-
- //
- // Set the DrawProcs to BlitPixie
- //
-
- // Set the screen drawProcs
- if (spriteWorldP->pixelDepth == 8) // 256 colors
- {
- SWSetSpriteWorldScreenDrawProc(spriteWorldP, BlitPixie8BitRectDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(spriteWorldP, BlitPixie8BitRectDrawProc);
- }
- else if ( !(SW_PPC && spriteWorldP->pixelDepth < 8) ) // Not 256 colors
- {
- SWSetSpriteWorldScreenDrawProc(spriteWorldP, BlitPixieAllBitRectDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(spriteWorldP, BlitPixieAllBitRectDrawProc);
- }
-
- // add the layers to the world
- SWAddSpriteLayer(spriteWorldP, brickLayerP);
- SWAddSpriteLayer(spriteWorldP, ballLayerP);
- SWAddSpriteLayer(spriteWorldP, paddleLayerP);
- SWAddSpriteLayer(spriteWorldP, buttonsLayerP);
-
- // Set the sprite drawProcs
- if (spriteWorldP->pixelDepth == 8) // 256 colors
- {
- SWSetSpriteDrawProc(ballSpriteP, BlitPixie8BitMaskDrawProc);
- SWSetSpriteDrawProc(paddleSpriteP, BlitPixie8BitRectDrawProc);
- }
- else if ( !(SW_PPC && spriteWorldP->pixelDepth < 8) ) // Not 256 colors
- {
- SWSetSpriteDrawProc(ballSpriteP, BlitPixieAllBitMaskDrawProc);
- SWSetSpriteDrawProc(paddleSpriteP, BlitPixieAllBitRectDrawProc);
- }
- SWSetSpriteDrawProc((SpritePtr) playButtonSpritePtr, BlitPixie8BitMaskDrawProc);
- SWSetSpriteDrawProc((SpritePtr) quitButtonSpritePtr, BlitPixie8BitMaskDrawProc);
- SWSetSpriteDrawProc((SpritePtr) disabledButtonSpritePtr, BlitPixie8BitMaskDrawProc);
- SWSetSpriteDrawProc((SpritePtr) pauseButtonSpritePtr, BlitPixie8BitMaskDrawProc); // [DB]
- SWSetSpriteDrawProc((SpritePtr) giveUpButtonSpritePtr, BlitPixie8BitMaskDrawProc); // [DB]
-
- //
- // Set the DrawProcs to BlitPixie
- //
-
- // Set the screen drawProcs
- if (spriteWorldP->pixelDepth == 8) // 256 colors
- {
- SWSetSpriteWorldScreenDrawProc(spriteWorldP, BlitPixie8BitRectDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(spriteWorldP, BlitPixie8BitRectDrawProc);
- }
- else if ( !(SW_PPC && spriteWorldP->pixelDepth < 8) ) // Not 256 colors
- {
- SWSetSpriteWorldScreenDrawProc(spriteWorldP, BlitPixieAllBitRectDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(spriteWorldP, BlitPixieAllBitRectDrawProc);
- }
-
-
- //
- // STEP #5: lock the sprite world !!! VERY IMPORTANT !!!
- //
-
- SWLockSpriteWorld(spriteWorldP);
-
-
- HideCursor();
- cursorVisible = false;
-
- //
- // SETP #6: Draw a nice background. Must be done *after* locking the SpriteWorld!
- //
-
- SWSetPortToBackground(spriteWorldP);
-
- if (spriteWorldP->pixelDepth == 1)
- pixPatH = GetPixPat(129); // B&W dithered background
- else
- pixPatH = GetPixPat(128); // Color
-
- if (pixPatH != NULL)
- {
- FillCRect(&moveBoundsRect, pixPatH);
- DisposePixPat(pixPatH);
- }
-
-
- // [DB] add help info to background
- {
- SInt16 x, y;
- OSErr err;
- RGBColor fore, back;
- Rect r;
-
- // read parms from file
- err = SWGOpenPersistenceFile ();
- SWGErrorReportingStub (err); // beep only if err
- err = SWGLoadRecord ((Ptr)&fore, sizeof (RGBColor), colorRez);
- SWGErrorReportingStub (err);
- err = SWGLoadRecord ((Ptr)&back, sizeof (RGBColor), colorRez + 1);
- SWGErrorReportingStub (err);
- err = SWGLoadRecord ((Ptr)&infoTextColor, sizeof (RGBColor), colorRez + 2);
- SWGErrorReportingStub (err);
- SWGClosePersistenceFile ();
-
- // writing pane
- r = qd.thePort->portRect;
- r.top = moveBoundsRect.bottom - 220;
- r.bottom = r.top + 170;
- RGBBackColor (&back);
- EraseRect (&r);
-
- // help text
- TextFont (kFontIDNewYork);
- TextSize (12);
- TextMode (srcOr);
- TextFace (bold);
- RGBForeColor (&fore);
-
- x = moveBoundsRect.left + 20;
- y = moveBoundsRect.bottom - 200;
- MoveTo (x, y);
- DrawString ("\pPress CMD or CMD-OPT & move buttons");
- y += 20;
- MoveTo (x, y);
- DrawString ("\pDemo keys • available at all times");
- y += 20;
- x += 15;
- MoveTo (x, y);
- DrawString ("\pSPACE = hide/show the system cursor");
- y += 15;
- MoveTo (x, y);
- DrawString ("\pS = save current button positions");
- y += 15;
- MoveTo (x, y);
- DrawString ("\pL = load button positions from file");
- y += 15;
- MoveTo (x, y);
- DrawString ("\pW = write counter into data file");
- y += 15;
- MoveTo (x, y);
- DrawString ("\pR = read counter from data file");
- y += 20;
- x -= 15;
- MoveTo (x, y);
- DrawString ("\pThe buttons may be moved while playing");
- y += 15;
- MoveTo (x, y);
- TextFace (italic);
- DrawString ("\p(Colors and R/W strings are also stored in the file)");
- TextFace (0);
-
- InsetRect (&r, 1, 1);
- FrameRect (&r);
- }
-
- SWSetPortToWindow(spriteWorldP);
- TextFont (kFontIDNewYork);
- TextSize (12);
- TextMode (srcOr);
- TextFace (bold);
-
-
- //
- // STEP #7: update the SpriteWorld and run the animation
- //
-
- SWGLoadSpritesInLayer (buttonsLayerP); // before first SW update (does not need buttons module to be inited)
-
- FingerCursorHandle = GetCursor(128);
- HLock((Handle)FingerCursorHandle);
- SWUpdateSpriteWorld(spriteWorldP, true);
- SWSetSpriteWorldMaxFPS( spriteWorldP, kMaxFPS );
- SWSyncSpriteWorldToVBL(spriteWorldP, kSyncToVBL);
-
- paddleSpriteP->userData=0; //Set up wiggle data which allows the demo paddle to move slightly erratically
- PaddleWiggle=-1;
-
- SetUpDemoSprites();
- SWGInitButtonSpriteWorld(SetButtonCursor);
-
- QuitBreakOut=false;
-
- // keep a running count of the saves using the persistence file [DB]
- err = SWGOpenPersistenceFile ();
- SWGErrorReportingStub (err);
- err = SWGLoadRecord ((Ptr)&countSaves, sizeof (countSaves), demoRez + 1);
- SWGErrorReportingStub (err);
- SWGClosePersistenceFile ();
-
- while (!QuitBreakOut)
- {
- while ( GetOSEvent( (keyDownMask), &event ) )
- {
- char key = event.message & charCodeMask;
-
- if (((event.message & keyCodeMask) >> 8)==0x35) QuitBreakOut=true; //User hit esc key - abort game
-
- ProcessDemoCommands (key); // [DB]
- }
-
- SWProcessSpriteWorld(spriteWorldP);
- if (spriteWorldP->frameHasOccurred)
- {
- SWGUpdateButtonData(); //must be called no more than once a frame
-
- // did we lose the last ball?
- if (ballSpriteP->userData == 2)
- {
- SetUpDemoSprites();
- }
- else if (BrickNum == 0)
- {
- SetUpDemoSprites();
- }
- else if (GiveUpBreakOut)
- {
- SetUpDemoSprites();
- }
-
- if (! PauseBreakOut)
- {
- // see if the ball has hit the paddle
- SWCollideSpriteLayer(spriteWorldP, paddleLayerP, ballLayerP);
-
- // see if the ball has hit the bricks
- SWCollideSpriteLayer(spriteWorldP, ballLayerP, brickLayerP);
- }
-
- SWAnimateSpriteWorld(spriteWorldP);
-
- // [DB] erase the demo counter control message
- if ((eraseTime > 0) && (eraseTime < TickCount ()))
- {
- SWUpdateSpriteWorld(spriteWorldP, true);
- eraseTime = 0;
- }
- }
- }
-
-
- //
- // STEP #8: Clean up
- //
-
- SWUnlockSpriteWorld(spriteWorldP);
- SWDisposeSpriteWorld(spriteWorldP);
- SWExitSpriteWorld();
-
- FlushEvents(everyEvent, 0);
- ShowCursor();
- cursorVisible = true;
- }
-
-
-
- ///--------------------------------------------------------------------------------------
- // ProcessDemoCommands [DB]
- ///--------------------------------------------------------------------------------------
-
- void ProcessDemoCommands (char key)
- {
- OSErr err;
-
- if (key == ' ')
- {
- cursorVisible = ! cursorVisible;
- gButtonsAreActive = cursorVisible;
- if (cursorVisible)
- ShowCursor ();
- else
- HideCursor ();
- }
- else if (key == 's' || key == 'S')
- {
- SWGSaveSpritesInLayer (buttonsLayerP);
- }
- else if (key == 'l' || key == 'L')
- {
- SWGLoadSpritesInLayer (buttonsLayerP);
- }
- else if (key == 'w' || key == 'W')
- {
- RGBColor black = {0,0,0};
-
- err = SWGOpenPersistenceFile ();
- SWGErrorReportingStub (err);
-
- // will write a string
- sprintf (demoStr, "Save #%ld, was %d bricks", ++countSaves, BrickNum);
- err = SWGSaveString (demoStr, sizeof (demoStr), demoRez);
- SWGErrorReportingStub (err);
-
- // will write a number
- err = SWGSaveRecord ((Ptr)&countSaves, sizeof (countSaves), demoRez + 1);
- SWGErrorReportingStub (err);
-
- SWGClosePersistenceFile ();
-
- if (eraseTime > 0) // avoid dirty overwriting -- purely a cosmetic hack
- SWUpdateSpriteWorld(spriteWorldP, true);
-
- MoveTo (moveBoundsRect.left + 2, moveBoundsRect.bottom - 3);
- RGBForeColor (&infoTextColor);
- DrawString ("\p WROTE: \"");
- DrawString (c2pstr (demoStr));
- DrawString ("\p\" ");
- RGBForeColor (&black);
- eraseTime = TickCount () + kEraseWritingTimer;
- }
- else if (key == 'r' || key == 'R')
- {
- RGBColor black = {0,0,0};
-
- err = SWGOpenPersistenceFile ();
- SWGErrorReportingStub (err);
-
- // read the string
- err = SWGLoadString (demoStr, sizeof (demoStr), demoRez);
- SWGErrorReportingStub (err);
-
- // read the number
- err = SWGLoadRecord ((Ptr)&countSaves, sizeof (countSaves), demoRez + 1);
- SWGErrorReportingStub (err);
-
- SWGClosePersistenceFile ();
-
- if (eraseTime > 0) // avoid dirty overwriting -- purely a cosmetic hack
- SWUpdateSpriteWorld(spriteWorldP, true);
-
- MoveTo (moveBoundsRect.left + 2, moveBoundsRect.bottom - 3);
- RGBForeColor (&infoTextColor);
- DrawString ("\p READ: \"");
- DrawString (c2pstr (demoStr));
- DrawString ("\p\" ");
- RGBForeColor (&black);
- eraseTime = TickCount () + kEraseReadingTimer;
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BallCollideProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void BallCollideProc(SpritePtr ballSpriteP, SpritePtr brickSpriteP, Rect* sectRect)
- {
- SInt16 offset;
- SInt16 vertMoveDelta = ballSpriteP->vertMoveDelta;
- SInt16 horizMoveDelta = ballSpriteP->horizMoveDelta;
-
-
- if (vertMoveDelta < 0)
- vertMoveDelta = -vertMoveDelta;
-
- if (horizMoveDelta < 0)
- horizMoveDelta = -horizMoveDelta;
-
- if (brickSpriteP->isVisible)
- {
- SWSetSpriteVisible(brickSpriteP, false);
- BrickNum--;
-
-
-
- if (vertMoveDelta < sectRect->bottom - sectRect->top)
- {
- // Hit left or right side of brick
-
- // Reverse direction
- ballSpriteP->horizMoveDelta = -ballSpriteP->horizMoveDelta;
-
- // "Bounce" ball off bricks
- offset = (sectRect->right - sectRect->left) * 2;
- if (ballSpriteP->horizMoveDelta < 0)
- offset = -offset;
-
- SWOffsetSprite(ballSpriteP, offset, 0);
- }
- else if (horizMoveDelta < sectRect->right - sectRect->left)
- {
- // Hit top or bottom of brick
-
- // Reverse direction
- ballSpriteP->vertMoveDelta = -ballSpriteP->vertMoveDelta;
-
- // "Bounce" ball off bricks
- offset = (sectRect->bottom - sectRect->top) * 2;
- if (ballSpriteP->vertMoveDelta < 0)
- offset = -offset;
-
- SWOffsetSprite(ballSpriteP, 0, offset);
- }
- else
- {
- // Hit corner of brick
-
- if ((sectRect->right - sectRect->left) > (sectRect->bottom - sectRect->top) )
- {
- // Hit left or right side of brick
-
- // Reverse direction
- ballSpriteP->horizMoveDelta = -ballSpriteP->horizMoveDelta;
-
- // "Bounce" ball off bricks
- offset = (sectRect->right - sectRect->left) * 2;
- if (ballSpriteP->horizMoveDelta < 0)
- offset = -offset;
-
- SWOffsetSprite(ballSpriteP, offset, 0);
- }
- else
- {
- // Hit top or bottom of brick
-
- // Reverse direction
- ballSpriteP->vertMoveDelta = -ballSpriteP->vertMoveDelta;
-
- // "Bounce" ball off bricks
- offset = (sectRect->bottom - sectRect->top) * 2;
- if (ballSpriteP->vertMoveDelta < 0)
- offset = -offset;
-
- SWOffsetSprite(ballSpriteP, 0, offset);
- }
- }
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // PaddleCollideProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void PaddleCollideProc(SpritePtr paddleSpriteP, SpritePtr ballSpriteP, Rect* sectRect)
- {
- SInt16 paddleMid = (paddleSpriteP->destFrameRect.right -
- paddleSpriteP->destFrameRect.left)/2;
- SInt16 ballMid = (ballSpriteP->destFrameRect.right -
- ballSpriteP->destFrameRect.left)/2;
-
- if ( (ballSpriteP->destFrameRect.bottom - ballSpriteP->vertMoveDelta)
- > paddleSpriteP->destFrameRect.bottom )
- return; // Return if ball did not hit above bottom of paddle
-
-
- // Set ball direction according to position hit on paddle
- if (ballSpriteP->destFrameRect.left + ballMid >
- paddleSpriteP->destFrameRect.left + paddleMid)
- {
- ballSpriteP->horizMoveDelta = ( (ballSpriteP->destFrameRect.left + ballMid) -
- (paddleSpriteP->destFrameRect.left + paddleMid) )/4;
-
- if (ballSpriteP->horizMoveDelta > 0)
- ballSpriteP->vertMoveDelta = kBallVertDelta - ballSpriteP->horizMoveDelta/2;
- else
- ballSpriteP->vertMoveDelta = kBallVertDelta + ballSpriteP->horizMoveDelta/2;
-
- if (ballSpriteP->horizMoveDelta == 0)
- ballSpriteP->horizMoveDelta++;
- }
- else
- {
- ballSpriteP->horizMoveDelta = ( (ballSpriteP->destFrameRect.left + ballMid) -
- (paddleSpriteP->destFrameRect.left + paddleMid) )/4;
-
- if (ballSpriteP->horizMoveDelta > 0)
- ballSpriteP->vertMoveDelta = kBallVertDelta - ballSpriteP->horizMoveDelta/2;
- else
- ballSpriteP->vertMoveDelta = kBallVertDelta + ballSpriteP->horizMoveDelta/2;
-
- if (ballSpriteP->horizMoveDelta == 0)
- ballSpriteP->horizMoveDelta--;
- }
-
-
- // If ball was moving down, turn it around
- if (ballSpriteP->vertMoveDelta > 0)
- ballSpriteP->vertMoveDelta = -ballSpriteP->vertMoveDelta;
-
- if ( (ballSpriteP->destFrameRect.bottom - ballSpriteP->vertMoveDelta)
- > paddleSpriteP->destFrameRect.top )
- {
- SWOffsetSprite(ballSpriteP, 0, sectRect->top - sectRect->bottom);
- }
-
- }
-
-
- ///--------------------------------------------------------------------------------------
- // SetUpPaddle
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void SetUpPaddle(SpritePtr paddleSpriteP)
- {
- SInt16 middle = (paddleSpriteP->moveBoundsRect.right -
- paddleSpriteP->moveBoundsRect.left) / 2;
- SInt16 paddleWidth = (paddleSpriteP->destFrameRect.right -
- paddleSpriteP->destFrameRect.left);
- Point globalPoint;
-
-
- GetMouse(&newPoint);
- globalPoint = newPoint;
- LocalToGlobal(&globalPoint);
-
- if (globalPoint.h < middle)
- {
- SWMoveSprite(paddleSpriteP, paddleSpriteP->moveBoundsRect.left +
- globalPoint.h, paddleSpriteP->moveBoundsRect.bottom - 30);
- }
- else if (qd.screenBits.bounds.right - globalPoint.h < middle)
- {
- SWMoveSprite(paddleSpriteP, paddleSpriteP->moveBoundsRect.right+1 -
- (qd.screenBits.bounds.right - globalPoint.h) - paddleWidth,
- paddleSpriteP->moveBoundsRect.bottom - 30);
- }
- else
- {
- SWMoveSprite(paddleSpriteP, paddleSpriteP->moveBoundsRect.left +
- middle - paddleWidth/2, paddleSpriteP->moveBoundsRect.bottom - 30);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // PaddleMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void PaddleMoveProc(SpritePtr paddleSpriteP)
- {
- oldPoint = newPoint;
-
- if (PauseBreakOut)
- return;
-
- GetMouse(&newPoint);
-
- SWOffsetSprite(paddleSpriteP, newPoint.h - oldPoint.h, 0);
-
- if (paddleSpriteP->destFrameRect.left < paddleSpriteP->moveBoundsRect.left)
- {
- SWOffsetSprite(paddleSpriteP, (paddleSpriteP->moveBoundsRect.left -
- paddleSpriteP->destFrameRect.left) , 0);
- }
- else if (paddleSpriteP->destFrameRect.right > paddleSpriteP->moveBoundsRect.right)
- {
- SWOffsetSprite(paddleSpriteP, (paddleSpriteP->moveBoundsRect.right -
- paddleSpriteP->destFrameRect.right) , 0);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // PaddleDemoMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void PaddleDemoMoveProc(SpritePtr paddleSpriteP)
- {
-
- // During the demo we must do this wiggle nonsense - or else the ball will always hit the
- // paddle in the exact same spot, which causes it to bounce at the exact same angle,
- // often leading into a infinite loop - which is boring. So we add a wiggle factor.
-
- paddleSpriteP->userData+=PaddleWiggle;
-
- if (paddleSpriteP->userData<-10)
- {
- PaddleWiggle=1;
- paddleSpriteP->userData=-10;
- }
- if (paddleSpriteP->userData>40)
- {
- PaddleWiggle=-1;
- paddleSpriteP->userData=40;
- }
-
- SWMoveSprite(paddleSpriteP, ballSpriteP->destFrameRect.left-paddleSpriteP->userData, paddleSpriteP->moveBoundsRect.bottom - 30);
-
- if (paddleSpriteP->destFrameRect.left < paddleSpriteP->moveBoundsRect.left)
- {
- SWOffsetSprite(paddleSpriteP, (paddleSpriteP->moveBoundsRect.left -
- paddleSpriteP->destFrameRect.left) , 0);
- }
- else if (paddleSpriteP->destFrameRect.right > paddleSpriteP->moveBoundsRect.right)
- {
- SWOffsetSprite(paddleSpriteP, (paddleSpriteP->moveBoundsRect.right -
- paddleSpriteP->destFrameRect.right) , 0);
- }
- }
-
-
- ///--------------------------------------------------------------------------------------
- // BallMoveProc
- ///--------------------------------------------------------------------------------------
-
- SW_FUNC void BallMoveProc(SpritePtr srcSpriteP)
- {
- register SInt16 inset;
-
- if (PauseBreakOut)
- return;
-
- // Move the sprite
- SWOffsetSprite(srcSpriteP, srcSpriteP->horizMoveDelta, srcSpriteP->vertMoveDelta);
-
-
- // Check for collision with walls
- if ((srcSpriteP->destFrameRect.left < srcSpriteP->moveBoundsRect.left) &&
- (srcSpriteP->horizMoveDelta < 0)) // Past left bounds and moving left
- {
- srcSpriteP->horizMoveDelta *= -1; // Reverse direction
- inset = srcSpriteP->moveBoundsRect.left - srcSpriteP->destFrameRect.left;
- SWOffsetSprite( srcSpriteP, inset * 2, 0 ); // "Bounce" sprite off bounds
-
- }
- else if ((srcSpriteP->destFrameRect.right > srcSpriteP->moveBoundsRect.right)&&
- (srcSpriteP->horizMoveDelta > 0)) // Past right bounds and moving right
- {
- srcSpriteP->horizMoveDelta *= -1; // Reverse direction
- inset = srcSpriteP->moveBoundsRect.right - srcSpriteP->destFrameRect.right;
- SWOffsetSprite( srcSpriteP, inset * 2, 0 ); // "Bounce" sprite off bounds
- }
-
- if ((srcSpriteP->destFrameRect.top < srcSpriteP->moveBoundsRect.top) &&
- (srcSpriteP->vertMoveDelta < 0)) // Past top bounds and moving up
- {
- srcSpriteP->vertMoveDelta *= -1; // Reverse direction
- inset = srcSpriteP->moveBoundsRect.top - srcSpriteP->destFrameRect.top;
- SWOffsetSprite( srcSpriteP, 0, inset * 2 ); // "Bounce" sprite off bounds
- }
- else if ((srcSpriteP->oldFrameRect.top > srcSpriteP->moveBoundsRect.bottom)&&
- (srcSpriteP->vertMoveDelta > 0)) // Past bottom bounds and moving down
- {
- SysBeep(1);
- srcSpriteP->userData++;
-
- SWSetSpriteLocation(srcSpriteP, -100, 50);
-
- SWSetSpriteMoveDelta(srcSpriteP, kBallHorizDelta, kBallVertDelta);
- }
- }
-
- // Set up all the sprites to start a game
- void SetUpGameSprites(void)
- {
- HideCursor();
- cursorVisible = false;
-
- ballSpriteP->userData=0;
-
- moveBoundsRect = srcWindowP->portRect;
-
- // set up the bricks
- for (BrickNum = 0; BrickNum < kTotalNumberOfBricks; BrickNum++)
- {
- SWSetSpriteVisible(brickSpriteArray[BrickNum], true);
- }
-
- // hide/show button sprites because we are playing a game
- SWSetSpriteVisible((SpritePtr)playButtonSpritePtr, false);
- SWSetSpriteVisible((SpritePtr)quitButtonSpritePtr, false);
- SWSetSpriteVisible((SpritePtr)disabledButtonSpritePtr, false);
- SWSetSpriteVisible((SpritePtr)pauseButtonSpritePtr, true); // [DB]
- SWSetSpriteVisible((SpritePtr)giveUpButtonSpritePtr, true); // [DB]
-
- // set the ball’s movement characteristics
- SWMoveSprite(ballSpriteP, - 100, 50);
- SWSetSpriteMoveBounds(ballSpriteP, &moveBoundsRect);
- SWSetSpriteMoveDelta(ballSpriteP, kBallHorizDelta, kBallVertDelta);
- SWSetSpriteMoveProc(ballSpriteP, BallMoveProc);
- SWSetSpriteCollideProc(ballSpriteP, BallCollideProc);
-
- // set the paddle’s movement characteristics
- SWSetSpriteMoveBounds(paddleSpriteP, &moveBoundsRect);
- SetUpPaddle(paddleSpriteP);
- SWSetSpriteMoveProc(paddleSpriteP, PaddleMoveProc);
- SWSetSpriteCollideProc(paddleSpriteP, PaddleCollideProc);
-
- //
- // Set the DrawProcs to BlitPixie
- //
-
- // Set the screen drawProcs
- if (spriteWorldP->pixelDepth == 8) // 256 colors
- {
- SWSetSpriteWorldScreenDrawProc(spriteWorldP, BlitPixie8BitRectDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(spriteWorldP, BlitPixie8BitRectDrawProc);
- }
- else if ( !(SW_PPC && spriteWorldP->pixelDepth < 8) ) // Not 256 colors
- {
- SWSetSpriteWorldScreenDrawProc(spriteWorldP, BlitPixieAllBitRectDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(spriteWorldP, BlitPixieAllBitRectDrawProc);
- }
- SWSetSpriteWorldMaxFPS( spriteWorldP, kMaxFPS );
- }
-
-
- // Set up all the sprites to start the demo
- void SetUpDemoSprites(void)
- {
- ShowCursor();
- cursorVisible = true;
-
- ballSpriteP->userData=0;
-
- moveBoundsRect = srcWindowP->portRect;
-
- // set up the bricks
- for (BrickNum = 0; BrickNum < kTotalNumberOfBricks; BrickNum++)
- {
- SWSetSpriteVisible(brickSpriteArray[BrickNum], true);
- }
-
- // show button sprites because the demo is running
- SWSetSpriteVisible((SpritePtr)playButtonSpritePtr, true);
- SWSetSpriteMoveProc((SpritePtr)playButtonSpritePtr, ButtonMoveProc);
- SWGEnableButton(playButtonSpritePtr, true);
-
- SWSetSpriteVisible((SpritePtr)quitButtonSpritePtr, true);
- SWSetSpriteMoveProc((SpritePtr)quitButtonSpritePtr, ButtonMoveProc);
- SWGEnableButton(quitButtonSpritePtr, true);
-
- SWSetSpriteVisible((SpritePtr)disabledButtonSpritePtr, true);
- SWSetSpriteMoveProc((SpritePtr)disabledButtonSpritePtr, ButtonMoveProc);
- SWGEnableButton(disabledButtonSpritePtr, false);
-
- SWSetSpriteVisible((SpritePtr)pauseButtonSpritePtr, false); // [DB]
- SWSetSpriteMoveProc((SpritePtr)pauseButtonSpritePtr, ButtonMoveProc); // [DB]
- SWGEnableButton(pauseButtonSpritePtr, true); // [DB]
-
- SWSetSpriteVisible((SpritePtr)giveUpButtonSpritePtr, false); // [DB]
- SWSetSpriteMoveProc((SpritePtr)giveUpButtonSpritePtr, ButtonMoveProc); // [DB]
- SWGEnableButton(giveUpButtonSpritePtr, true); // [DB]
-
- // set the ball’s movement characteristics
- SWMoveSprite(ballSpriteP, - 100, 50);
- SWSetSpriteMoveBounds(ballSpriteP, &moveBoundsRect);
- SWSetSpriteMoveDelta(ballSpriteP, kBallHorizDelta, kBallVertDelta);
- SWSetSpriteMoveProc(ballSpriteP, BallMoveProc);
- SWSetSpriteCollideProc(ballSpriteP, BallCollideProc);
-
- // set the paddle’s movement characteristics
- SWSetSpriteMoveBounds(paddleSpriteP, &moveBoundsRect);
- SetUpPaddle(paddleSpriteP);
- SWSetSpriteMoveProc(paddleSpriteP, PaddleDemoMoveProc);
- SWSetSpriteCollideProc(paddleSpriteP, PaddleCollideProc);
-
- //
- // Set the Screen DrawProcs to use Quickdraw
- //
-
- // Set the screen drawProcs
- if (spriteWorldP->pixelDepth == 8) // 256 colors
- {
- SWSetSpriteWorldScreenDrawProc(spriteWorldP, SWStdWorldDrawProc); // During demos we must use copybits to draw to the screen because the
- SWSetSpriteWorldOffscreenDrawProc(spriteWorldP, BlitPixie8BitRectDrawProc); // cursor will be visible and so if we didnt it would leave artifacts
- }
- else if ( !(SW_PPC && spriteWorldP->pixelDepth < 8) ) // Not 256 colors
- {
- SWSetSpriteWorldScreenDrawProc(spriteWorldP, SWStdWorldDrawProc);
- SWSetSpriteWorldOffscreenDrawProc(spriteWorldP, BlitPixieAllBitRectDrawProc);
- }
- SWSetSpriteWorldMaxFPS( spriteWorldP, 0 );
-
- GiveUpBreakOut = false;
- PauseBreakOut = false;
- }
-
- // ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
- // start of button-related routines
- // ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
- // These are just some generic button state proc. They are called when the mouse is passed over or clicked
- // in a button to change its appearance. Right now they just set the appropriate frame of a generic sprite.
- // You could put routines here to have animated buttons, sounds for mouseover or clicking or whatever you want.
- // ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
-
- SW_FUNC void GenericDrawButtonUpProc(ButtonSpritePtr srcButtonP, int ButtonStateChanged)
- {
- if (ButtonStateChanged) SWSetCurrentFrameIndex((SpritePtr) srcButtonP, kButtonUp);
- }
-
- SW_FUNC void GenericDrawButtonMouseOverProc(ButtonSpritePtr srcButtonP, int ButtonStateChanged)
- {
- if (ButtonStateChanged) SWSetCurrentFrameIndex((SpritePtr) srcButtonP, kButtonMouseOver);
- }
-
- SW_FUNC void GenericDrawButtonDownProc(ButtonSpritePtr srcButtonP, int ButtonStateChanged)
- {
- if (ButtonStateChanged) SWSetCurrentFrameIndex((SpritePtr) srcButtonP, kButtonMouseDown);
- }
-
- SW_FUNC void GenericDrawButtonDisabledProc(ButtonSpritePtr srcButtonP, int ButtonStateChanged)
- {
- if (ButtonStateChanged) SWSetCurrentFrameIndex((SpritePtr) srcButtonP, kButtonDisabled);
- }
-
- // ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
-
- // When the buttons are clicked on these action Procs are called
-
- SW_FUNC void PlayProc(SpritePtr srcSpriteP)
- {
- #pragma unused (srcSpriteP)
-
- SetUpGameSprites();
- }
-
- SW_FUNC void QuitProc(SpritePtr srcSpriteP)
- {
- #pragma unused (srcSpriteP)
-
- QuitBreakOut=true;
- }
-
-
- SW_FUNC void PauseProc(SpritePtr srcSpriteP)
- {
- #pragma unused (srcSpriteP)
-
- PauseBreakOut = (! PauseBreakOut);
- }
-
-
- SW_FUNC void GiveUpProc(SpritePtr srcSpriteP)
- {
- #pragma unused (srcSpriteP)
-
- GiveUpBreakOut = true;
- }
-
- SW_FUNC void SetButtonCursor(int CursorIsInAButton)
- {
- if (CursorIsInAButton) SetCursor(*FingerCursorHandle);
- else SetCursor(&qd.arrow);
- }
-
- // ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
- // end of button-related routines
- // ≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈
-